package com;

/**
 * 死锁 : 在执行的过程中,都遇到了对方进入加锁的方法,需要等待,导致都访问不了的状态
 * 
 * 原理 :
 * 		1.某一个线程执行完成需要先后嵌套锁定两个对象在这个过程中,先锁定1对象
 * 2.另一个线程执行完成需要先后嵌套锁定两个对象在这个过程中,先锁定2对象 
 * 3.在第一个线程的执行过程中,到了锁定2对象的时候发现2对象被锁,只能进入等待
 * 4.在第二个线程执行过程中,到了锁定1对象的时候发现,1对象被锁,是能进入等待
 * 
 * @author lenovo
 * @date 2020年7月24日
 */
public class Thread_12_DeadLock {

	public static void main(String[] args) {
		Object o1 = new Object();
		Object o2 = new Object();
		Thread t1 = new Thread(new T1(o1, o2));
		Thread t2 = new Thread(new T2(o1, o2));
		t1.start();
		t2.start();
		System.out.println("----");
		// 发生死锁
	}

}

class T1 implements Runnable {
	Object o1;
	Object o2;

	public T1(Object o1, Object o2) {
		super();
		this.o1 = o1;
		this.o2 = o2;
	}

	@Override
	public void run() {
		synchronized (o1) {
			try {
				// 加睡眠是为了保证让T1把o1锁住,让T2把o2锁住
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			synchronized (o2) {
				System.out.println("T1执行完成");
			}
		}
	}
}

class T2 implements Runnable {
	Object o1;
	Object o2;

	public T2(Object o1, Object o2) {
		super();
		this.o1 = o1;
		this.o2 = o2;
	}

	@Override
	public void run() {
		synchronized (o2) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			synchronized (o1) {
				System.out.println("T2执行完成");
			}
		}
	}
}